package org.microframework.base.core.security.utils;

import org.microframework.base.core.security.context.SecurityContextHolder;
import org.microframework.base.core.security.exception.NotAuthorizedException;
import org.microframework.base.core.security.model.LoginUser;

/**
 * 安全工具类
 * 
 * 提供对当前登录用户的快捷访问方法
 */
public class SecurityUtils {
    
    private SecurityUtils() {
        // 工具类不允许实例化
    }
    
    /**
     * 获取当前登录用户
     * 
     * @return 当前登录用户
     */
    public static LoginUser getLoginUser() {
        return SecurityContextHolder.getLoginUser();
    }
    
    /**
     * 获取当前登录用户ID
     * 
     * @return 当前登录用户ID
     */
    public static Long getUserId() {
        return SecurityContextHolder.getUserId();
    }
    
    /**
     * 获取当前登录用户名
     * 
     * @return 当前登录用户名
     */
    public static String getUsername() {
        return SecurityContextHolder.getUsername();
    }
    
    /**
     * 判断用户是否已登录
     * 
     * @return 是否已登录
     */
    public static boolean isLoggedIn() {
        return getLoginUser() != null;
    }
    
    /**
     * 确保用户已登录，未登录则抛出异常
     * 
     * @throws NotAuthorizedException 如果用户未登录
     */
    public static void ensureLoggedIn() {
        if (!isLoggedIn()) {
            throw new NotAuthorizedException("用户未登录");
        }
    }
    
    /**
     * 判断当前用户是否拥有指定权限
     * 
     * @param permission 权限标识
     * @return 是否拥有权限
     */
    public static boolean hasPermission(String permission) {
        return SecurityContextHolder.hasPermission(permission);
    }
    
    /**
     * 确保当前用户拥有指定权限，否则抛出异常
     * 
     * @param permission 权限标识
     * @throws NotAuthorizedException 如果用户没有指定权限
     */
    public static void ensurePermission(String permission) {
        if (!hasPermission(permission)) {
            throw new NotAuthorizedException("缺少权限: " + permission);
        }
    }
    
    /**
     * 判断当前用户是否拥有指定角色
     * 
     * @param role 角色标识
     * @return 是否拥有角色
     */
    public static boolean hasRole(String role) {
        return SecurityContextHolder.hasRole(role);
    }
    
    /**
     * 确保当前用户拥有指定角色，否则抛出异常
     * 
     * @param role 角色标识
     * @throws NotAuthorizedException 如果用户没有指定角色
     */
    public static void ensureRole(String role) {
        if (!hasRole(role)) {
            throw new NotAuthorizedException("缺少角色: " + role);
        }
    }
    
    /**
     * 判断当前用户是否为管理员
     * 
     * @return 是否为管理员
     */
    public static boolean isAdmin() {
        LoginUser loginUser = getLoginUser();
        return loginUser != null && loginUser.isAdmin();
    }
    
    /**
     * 确保当前用户是管理员，否则抛出异常
     * 
     * @throws NotAuthorizedException 如果用户不是管理员
     */
    public static void ensureAdmin() {
        if (!isAdmin()) {
            throw new NotAuthorizedException("需要管理员权限");
        }
    }
} 